/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package DAO;
import java.sql.*;
import java.io.*;
import java.util.InvalidPropertiesFormatException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
/**
 * 
 *Class này thực hiện chức năng đóng mở cở sở dữ liệu,kết nối tới cơ sở dữ liệu đọc file cấu hình config.xml
 */
public class SubConfig {
    private static SubConfig instance = null;
    private String password = "vipkhang";
    private String username = "postgres";
    private String dbName = "quanglysieuthi";
    private String driver = "org.postgresql.Driver";
    private String url = "jdbc:postgresql://localhost:5432/";
    private String m_Path = ""; 
    public void setPath(String path) {
        this.m_Path = path;
    }
     /**
     * Khi mở dữ liệu thành công thì connec khác null.Thực hiện các hàm liên quan đến cơ sở dữ liệu
     */
    public Connection connec = null;

    /**
     * 
     */
    /**
     * 
     */
    private SubConfig() {
        m_Path = "";
    }
    public String toString() {
        String s = "";
        s = s + "{ " + " url : " + this.url + ", driver :" + this.driver;
        s = s + ", databaName :" + this.dbName + ", username :" + this.username + ", password :" + this.password + " }";
        return s;
    }
    /**
     * @return Hàm khởi tạo 1 đối tượng 
     */
    public static SubConfig getInstance() {

        if (instance == null) {
            instance = new SubConfig();
        }
        return instance;
    }
     /**
     * @param driver .Truyền vào drive để sử dụng khi làm việc với database.Ví dụ :com.mysql.jdbc.Driver 
     */
    public void setDriver(String driver) {
        this.driver = driver;
    }

    /**
     * @param url.Truyền vào địa chỉ của database(localhost hay 192.168.1.10) ví dụ :jdbc:mysql://localhost:3306/
     */
    public void setUrl(String url) {
        this.url = url;
    }

    /**
     * @param userName :Truyền với userName của cơ sở dữ liệu.Ví dụ :root
     */
    public void setUserName(String userName) {
        this.username = userName;
    }

    /**
     * @param passWord.Truyền vào pass của cơ sở dữ liệu.Ví dụ :1234
     */
    public void setPassWord(String passWord) {
        this.password = passWord;
    }

    /**
     * @param dataBaseName.Tên 1 database.Ví dụ :dbcoax
     */
    public void setdataBaseName(String dataBaseName) {
        this.dbName = dataBaseName;
    }

    /**
     * @return.
     */
    public String getDriver() {
        return this.driver;
    }

    public String getUrl() {
        return this.url;
    }

    public String getUserName() {
        return this.username;
    }

    public String getPassWord() {
        return this.password;
    }

    public String getdataBaseName() {
        return this.dbName;
    }

    public void conection_postgre(){
        Connection connec = null;     
        
        try {
            Driver d = new org.postgresql.Driver();
            DriverManager.registerDriver(d);
            String myconnecString = this.url + this.dbName;
            Properties props = new Properties();
            props.setProperty("user",this.username);
            props.setProperty("password",this.password);
            props.setProperty("characterEncoding","utf-8");
            //props.setProperty("ssl","true");
            System.out.println("connection url myconnecString : " + myconnecString + " user name : " + this.username);
            connec = DriverManager.getConnection(myconnecString, props);
            System.out.println("ket noi thanh cong!");
        } catch (SQLException ex) {
            System.out.println("That bai " + ex.toString());
            Logger.getLogger(SubConfig.class.getName()).log(Level.SEVERE, null, ex);
        }
        this.connec = connec;
    }
    /**
     * Hàm này gọi để mở cở sở dữ liệu
     */
    public void connection() {
        Connection connec = null;
        try {
            @SuppressWarnings("unused")
            String myconnecString = this.url + this.dbName;
            Class.forName(this.driver).newInstance();
            //connec = DriverManager.getConnection(myconnecString, this.username, this.password);
            if (this.username == "" || this.password == "") {
                connec = DriverManager.getConnection(myconnecString);//, info
            } else {
                connec = DriverManager.getConnection(myconnecString, this.username, this.password);
            }
            System.out.println("ket noi thanh cong poster org.postgresql.Driver!");
        } catch (Exception ex) {
            connec = null;
            System.out.println("That bai " + ex.toString());
        }
        this.connec = connec;
        //return connec;
    }

    /**
     * Đóng cở sở dữ liệu khi không làm việc nữa
     */
    public void close() {
        if (this.connec != null) {
            try {
                this.connec.close();
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    }
    /**
     * Hàm gọi khởi tạo và mở cơ sở dữ liệu đồng thời đọc thông tin từ file config.xml
     */
    public void init() {
       // this.readXMLConfig();
        //ham nay se doc tu XML len trong cau hinh config
      //  this.setUrl(this.url);//
        //this.setUrl("jdbc:mysql://localhost:3306/");//
       // this.setdataBaseName(this.dbName);
       // this.setDriver(this.driver);
       // this.setUserName(this.username);
       // this.setPassWord(this.password);//Heather1
        //this.setPassWord("1234");//Heather1
        this.connection();
       // this.conection_postgre();
    }

    /**
     * @param path.Truyền vào 1 đường dẫn.
     * @return Trả về 1 đường dẫn lùi lại 2 cấp so với khi truyền vào
     */
    public  String getPath(String path){ 
        
    	path = path.replaceAll(Matcher.quoteReplacement("\\"), Matcher.quoteReplacement(File.separator));
        System.out.println("Replace \\:" + path);
        path = path.replaceAll(Matcher.quoteReplacement("/"), Matcher.quoteReplacement(File.separator));
        System.out.println("Replace /:" + path);        
           if(path.contains("!"))
        {
        int indexOfExclaim = path.indexOf("!") ;
        String sExclamation = path.substring(indexOfExclaim,path.length());
        System.out.println(sExclamation);
        path = path.replaceAll(Matcher.quoteReplacement(sExclamation), Matcher.quoteReplacement(""));
            int lastindex = path.lastIndexOf(File.separator);
        if (lastindex != -1) {
            path = path.substring(0, lastindex);
        }
        }
        int lastindex = path.lastIndexOf(File.separator);
        if (lastindex != -1) {
            path = path.substring(0, lastindex);
            System.out.println("Duong dan dau cat 1:" + path);
            lastindex = path.lastIndexOf(File.separator);
            if (lastindex != -1) {
                path = path.substring(0, lastindex);
            }

        }     
    	return path;
    }
    /**
     * 
     */
    private void readXMLConfig() {
        Properties prop = new Properties();
        String path = SubConfig.class.getProtectionDomain().getCodeSource().getLocation().getPath();
        System.out.println("Duong dan dau tien:" + path + "File.separator" + File.separator);        
        path = this.getPath(path);
        path = path + File.separator + "config.xml";
        System.out.println("cuoi cung" + path);
        try {
            prop.loadFromXML(new FileInputStream(this.m_Path=path));// + File.separatorChar
        } catch (InvalidPropertiesFormatException e) {
            e.printStackTrace();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        String key = "Driver";
        String value = prop.getProperty(key);
        this.driver = value;
        key = "Username";
        value = prop.getProperty(key);
        this.username = value;
        key = "password";
        value = prop.getProperty(key);
        this.password = value;
        key = "Url";
        value = prop.getProperty(key);
        this.url = value;
        key = "DbCoax";
        value = prop.getProperty(key);
        this.dbName = value;
    }
}
